/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package control;

import control.filtros.Filtro;
import control.filtros.FiltroCandidatosAspiracionCargo;
import control.filtros.FiltroCandidatosAspiracionSalarial;
import control.filtros.FiltroCandidatosCedula;
import control.filtros.FiltroCandidatosEstado;
import control.filtros.FiltroCandidatosNombre;
import control.filtros.FiltroCandidatosProfesion;
import control.filtros.FiltroCargosDepartamento;
import control.filtros.FiltroCargosEstado;
import control.filtros.FiltroCargosNombre;
import control.filtros.FiltroCargosSalario;
import control.filtros.FiltroEmpleadoCargo;
import control.filtros.FiltroEmpleadoCedula;
import control.filtros.FiltroEmpleadoEstado;
import control.filtros.FiltroEmpleadoNombre;
import control.filtros.FiltroEmpleadoProfesion;
import entidad.Candidato;
import entidad.Cargo;
import entidad.Empleado;
import entidad.Sistema;
import frontera.dao.BonoDAO;
import frontera.dao.CambiosCargoDAO;
import frontera.dao.CambiosEmpleadoDAO;
import frontera.dao.CambiosPrestacionDAO;
import frontera.dao.CandidatoDAO;
import frontera.dao.CargoDAO;
import frontera.dao.DepartamentoDAO;
import frontera.dao.EmpleadoDAO;
import frontera.dao.FallaDAO;
import frontera.dao.HoraExtraDAO;
import frontera.dao.HorarioDAO;
import frontera.dao.HorarioDiaDAO;
import frontera.dao.PrestacionDAO;
import frontera.dao.UsuarioDAO;
import frontera.interfaz.InterfazFactory;
import frontera.interfaz.ventana.VentanaAutenticacion2;
import frontera.interfaz.ventana.VentanaPrincipal;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
import org.pushingpixels.substance.api.SubstanceLookAndFeel;

/**
 *
 * @author tuareg
 */
public class SIRHApp {

	private SIRHApp() {
		admEmpleados = new AdministrarEmpleados();
		admCandidatos = new AdministrarCandidatos();
		admCargos = new AdministrarCargos();
		admPrestaciones = new AdministrarPrestaciones();
		admUsuarios = new AdministrarUsuarios();
		admCambios = new AdministrarCambios();
		sistema = new Sistema();
	}

	public static void main(String[] args) {
		//Le decimos al SO que java se encargara del manejo de la decoracion
		//del contorno de la ventana
		JFrame.setDefaultLookAndFeelDecorated(true);
		//Aplicamos un skin a nuestra ventana, en este caso SaharaSkin

		Runnable doWorkRunnable = new Runnable() {

			public void run() {

				SIRHApp.getInstance().run();
			}
		};
		SwingUtilities.invokeLater(doWorkRunnable);

	}

	public void run() {
		SubstanceLookAndFeel.setSkin("org.pushingpixels.substance.api.skin.OfficeSilver2007Skin");
		VentanaAutenticacion2 ventanaAutenticacion = null;
		ventanaAutenticacion = new VentanaAutenticacion2();
		ventanaAutenticacion.setVisible(true);
	}

	public synchronized static SIRHApp getInstance() {
		while (m_this == null) {
			m_this = new SIRHApp();
		}
		return m_this;
	}

	public Sistema getSistema() {
		return sistema;
	}

	public VentanaPrincipal getVentanaPrincipal() {
		return ventanaPrincipal;
	}

	public AdministrarCandidatos getAdmCandidatos() {
		return admCandidatos;
	}

	public AdministrarCargos getAdmCargos() {
		return admCargos;
	}

	public AdministrarPrestaciones getAdmPrestaciones() {
		return admPrestaciones;
	}

	public AdministrarUsuarios getAdmUsuarios() {
		return admUsuarios;
	}

	public AdministrarEmpleados getAdmEmpleados() {
		return admEmpleados;
	}

	public void setVentanaPrincipal(VentanaPrincipal ventanaPrincipal) {
		this.ventanaPrincipal = ventanaPrincipal;
	}

	public AdministrarPermisos getAdmPermisos() {
		return admPermisos;
	}

	public void setAdmPermisos(AdministrarPermisos admPermisos) {
		this.admPermisos = admPermisos;
	}

	public InterfazFactory getFactoryInterfaz() {
		return factoryInterfaz;
	}

	public void setFactoryInterfaz(InterfazFactory factoryInterfaz) {
		this.factoryInterfaz = factoryInterfaz;
	}

	public AdministrarCambios getAdmCambios() {
		return admCambios;
	}

	public void setAdmCambios(AdministrarCambios admCambios) {
		this.admCambios = admCambios;
	}

        public CambiosCargoDAO getDAOCamCargo() {
            return DAOCamCargo;
        }

        public void setDAOCamCargo(CambiosCargoDAO DAOCamCargo) {
            this.DAOCamCargo = DAOCamCargo;
        }

        public CambiosEmpleadoDAO getDAOCamEmpleado() {
            return DAOCamEmpleado;
        }

        public void setDAOCamEmpleado(CambiosEmpleadoDAO DAOCamEmpleado) {
            this.DAOCamEmpleado = DAOCamEmpleado;
        }

        public CambiosPrestacionDAO getDAOCamPrestacion() {
            return DAOCamPrestacion;
        }

        public void setDAOCamPrestacion(CambiosPrestacionDAO DAOCamPrestacion) {
            this.DAOCamPrestacion = DAOCamPrestacion;
        }

	private static SIRHApp m_this;
	private VentanaPrincipal ventanaPrincipal;
	private static Sistema sistema;
	private AdministrarCandidatos admCandidatos;
	private AdministrarCargos admCargos;
	private AdministrarPrestaciones admPrestaciones;
	private AdministrarUsuarios admUsuarios;
	private AdministrarEmpleados admEmpleados;
	private AdministrarCambios admCambios;
	private AdministrarPermisos admPermisos = null;
	private InterfazFactory factoryInterfaz = null;
	private ArrayList<Filtro<Empleado>> filtrosEmpleados = null;
	private ArrayList<Filtro<Cargo>> filtrosCargos = null;
	private ArrayList<Filtro<Candidato>> filtrosCandidatos = null;

	private BonoDAO DAOBono = new BonoDAO();
        private CambiosCargoDAO DAOCamCargo = new CambiosCargoDAO();
        private CambiosEmpleadoDAO DAOCamEmpleado = new CambiosEmpleadoDAO();
        private CambiosPrestacionDAO DAOCamPrestacion = new CambiosPrestacionDAO();
	private CandidatoDAO DAOCandidato = new CandidatoDAO();
	private CargoDAO DAOCargo = new CargoDAO();
	private DepartamentoDAO DAODepartamento = new DepartamentoDAO();
	private FallaDAO DAOFalla = new FallaDAO();
	private EmpleadoDAO DAOEmpleado = new EmpleadoDAO();
	private HoraExtraDAO DAOHoraExtra = new HoraExtraDAO();
	private HorarioDAO DAOHorario = new HorarioDAO();
	private HorarioDiaDAO DAOHorarioDia = new HorarioDiaDAO();
	private PrestacionDAO DAOPrestacion = new PrestacionDAO();
	private UsuarioDAO DAOUsuario = new UsuarioDAO();
        
        private int cantidadPrestaciones = 12;

        public int getCantidadPrestaciones() {
            return cantidadPrestaciones;
        }

        public void setCantidadPrestaciones(int cantidadPrestaciones) {
            this.cantidadPrestaciones = cantidadPrestaciones;
        }

	public BonoDAO getDAOBono() {
		return DAOBono;
	}

	public CandidatoDAO getDAOCandidato() {
		return DAOCandidato;
	}

	public CargoDAO getDAOCargo() {
		return DAOCargo;
	}

	public DepartamentoDAO getDAODepartamento() {
		return DAODepartamento;
	}

	public EmpleadoDAO getDAOEmpleado() {
		return DAOEmpleado;
	}

	public FallaDAO getDAOFalla() {
		return DAOFalla;
	}

	public HoraExtraDAO getDAOHoraExtra() {
		return DAOHoraExtra;
	}

	public HorarioDAO getDAOHorario() {
		return DAOHorario;
	}

	public HorarioDiaDAO getDAOHorarioDia() {
		return DAOHorarioDia;
	}

	public PrestacionDAO getDAOPrestacion() {
		return DAOPrestacion;
	}

	public UsuarioDAO getDAOUsuario() {
		return DAOUsuario;
	}


	
	public ArrayList<Filtro<Candidato>> getFiltrosCandidatos() {
		if (filtrosCandidatos == null) {
			filtrosCandidatos = new ArrayList<Filtro<Candidato>>();
			filtrosCandidatos.add(new FiltroCandidatosNombre());
			filtrosCandidatos.add(new FiltroCandidatosCedula());
			filtrosCandidatos.add(new FiltroCandidatosProfesion());
			filtrosCandidatos.add(new FiltroCandidatosAspiracionSalarial());
			filtrosCandidatos.add(new FiltroCandidatosAspiracionCargo());
			filtrosCandidatos.add(new FiltroCandidatosEstado());
		}
		return filtrosCandidatos;
	}

	public ArrayList<Filtro<Empleado>> getFiltrosEmpleados() {
		if (filtrosEmpleados == null) {
			filtrosEmpleados = new ArrayList<Filtro<Empleado>>();
			filtrosEmpleados.add(new FiltroEmpleadoNombre());
			filtrosEmpleados.add(new FiltroEmpleadoCedula());
			filtrosEmpleados.add(new FiltroEmpleadoCargo());
			filtrosEmpleados.add(new FiltroEmpleadoProfesion());
			filtrosEmpleados.add(new FiltroEmpleadoEstado());
		}
		return filtrosEmpleados;
	}

	public ArrayList<Filtro<Cargo>> getFiltrosCargos() {
		if (filtrosCargos == null) {
			filtrosCargos = new ArrayList<Filtro<Cargo>>();
			filtrosCargos.add(new FiltroCargosNombre());
			filtrosCargos.add(new FiltroCargosDepartamento());
			filtrosCargos.add(new FiltroCargosSalario());
			filtrosCargos.add(new FiltroCargosEstado());
		}
		return filtrosCargos;
	}

	public static String errorBaseDatos(String entidad) {
		return "Error al modificar/agregar " + entidad + " a la base de datos. Por favor contacte al administrador de la base de datos.";
	}
}
